package com.fourWork.workOne;

import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

/**
 * 使用 List 集合实现简易的学生信息管理系统
 * 要求打印字符界面提示用户选择相应的功能，
 * 根据用户输入的选择去实现增加、删除、修改、查找以及遍历所有学生信息的功能。
 * 其中学生的信息有：学号、姓名、年龄。 要求： 尽量将功能拆分为多个.java 文件。
 */
public class StudentMethod {
    //声明Scanner类型的对象，用于用户从控制台输入
    private static Scanner scanner = new Scanner(System.in);

    /*
    查找所有学生信息方法
     */
    public void selectAll(List<Student> list) {
        //for each循环遍历list集合中的元素
        for (Student s : list) {
            System.out.println(s);
        }
    }

    /*
    根据学生编号查找学生信息方法
     */
    public void select(int id, List<Student> list) {
        //for each循环遍历lsit集合中的元素，
        for (Student s : list) {
            //得到元素在list集合中所对应的索引下标位置
            int i = list.indexOf(s);
            //判断如果用户输入的编号等于集合中获取到的学生编号，表示集合中存在该值，则打印
            if (id == s.getStudent_id()) {
//                System.out.println(id);
//                System.out.println(s.getStudent_id());
//                System.out.println(i);
//                Student student = list.get(i);
                System.out.println(list.get(i));

            }
        }
    }

    /*
    增加学生信息方法
     */
    public void add(int id, String name, int age, List<Student> list) {
        //1.创建list集合，用于保存学生对象
        //List<Student> list=new LinkedList();
        //2.声明Student对象且传参
        Student student = null;
        try {
            student = new Student(id, name, age);
        } catch (StudentIdException e) {
            e.printStackTrace();
        } catch (StudentAgeException e) {
            e.printStackTrace();
        }
        //System.out.println(student);
        //boolean contains = list.contains(student);
        //System.out.println(contains);
        //contains()：判断是否包含指定对象
//            if (list.contains(student)) {
//                System.out.println("学生已存在");
//            } else{
        // selectAll(list);
        //使用add方法将该对象存储到list集合中
        list.add(student);
        //System.out.print("增加成功，增加学员信息为：");
        //调用根据学生编号查询学生信息的方法
        select(id, list);
        //}
    }

    /*
    根据学生编号删除学生信息
    */
    public void remove(List<Student> list, int id) {
        //list.remove(id);
        for (Student s : list) {
            //System.out.println(s);
            //indexof():查找参数指定的对象
            int i = list.indexOf(s);
            //System.out.println("i获取的为" + i);
            if (id == s.getStudent_id()) {
                //System.out.println("---->"+s);
                //使用remove方法删除改下标对应的对象
                list.remove(i);
                System.out.println("删除成功！！！");
            }
        }
    }

    /*
    根据学生编号修改学生信息
     */
    public void update(List<Student> list, int id, Student student) {
        //System.out.println(student);
        for (Student s : list) {
            //indexof():查找参数指定的对象
            int i = list.indexOf(s);
            System.out.println("i===" + i);
            if (id == s.getStudent_id()) {
                //System.out.println(s);
                //set方法根据当前下标，对当前对象进行修改
                list.set(i, student);
                //System.out.println(">>>>"+set);
            }
        }
    }

    /*
    将学生信息写入到文件中
     */
    public void writerFile(List<Student> list_Student) {
        //创建list集合，用于获取学生信息
        List<Student> list = new ArrayList<>();
        //foreach遍历，将list_student集合中的数据添加到list集合中
        for (Student st : list_Student) {
            list.add(st);
        }
        //声明File类型的对象，获取文件或目录的特征信息
        File file = new File("D:\\a\\student.txt");
        //声明ObjectOutputStream类型对象，用于将一个对象的所有内容整体写入到输出流中
        ObjectOutputStream objectOutputStream = null;
        //判断文件是否存在，不存在则创建
        if (!file.exists()) {
            try {
                //创建目录
                if (file.isFile()) {
                    file.mkdirs();
                }
                //创建文件
                if (file.isDirectory()) {
                    file.createNewFile();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            //给ObjectOutputStream类型对象赋值
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\a\\student.txt"));
            //将参数指定的对象整体写入到输出流中
            objectOutputStream.writeObject(list);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭输出流并释放有关的资源
            if (null != objectOutputStream) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /*
    从文件中读取学生信息，保存到list集合中
     */
    public List<Student> readFile() {
        List<Student> students = new ArrayList<>();
        // 声明File类型的对象，获取文件或目录的特征信息
        File file = new File("D:\\a\\student.txt");
        //声明ObjectInputStream对象，根据参数指定的引用来构造对象
        ObjectInputStream objectInputStream = null;
        //判断文件是否存在，不存在则创建
        if (!file.exists()) {
            try {
                // 创建文件
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            // 判断文件是否为空，不为空则获取信息
            if (0 != file.length()) {
                //给ObjectInputStream对象赋值
                objectInputStream = new ObjectInputStream(new FileInputStream("D:\\a\\student.txt"));
                //用于从输入流中读取一个对象并返回，赋值给List集合
                students = (List<Student>) objectInputStream.readObject();  //(List<Student>)强转
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if (objectInputStream != null) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回List集合
        return students;
    }

    //main方法，程序入口
    public static void main(String[] args) {

        //声明list集合用于存储学生信息
        List<Student> list = new LinkedList<>();
        //声明StudentMethod类型的对象
        StudentMethod studentMethod = new StudentMethod();
//        System.out.println( studentMethod.readFile());
        for (Student ss : studentMethod.readFile()) {
            list.add(ss);
        }
        //System.out.println(studentMethod.readFile());

        //编号
        int id;
        //姓名
        String name;
        //年龄
        int age;


//        studentMethod.add(200, "刘备", 27, list);
//        //studentMethod.remove(list, 200);
//        Student student = new Student(3, "关羽", 30);
//        studentMethod.update(list, 1, student);
//        studentMethod.selectAll(list);
//        System.out.println("-------------");
//        studentMethod.select(3, list);
        /*
        增加、删除、修改、查找以及遍历所有学生信息
         */
        //声明Boolean类型对象，用于判断循环是否结束
        boolean b = true;
        //使用while循环完成用户可循环操作
        while (true == b) {
            System.out.println("------------学生信息管理系统------------");
            System.out.println("1、增加学生信息         2、查找所有学生信息");
            System.out.println("3、修改学生信息         4、查看学生信息   ");
            System.out.println("5、删除学生信息         6、退出学生信息管理系统");
            System.out.println("-------------------------------------");
            //
            System.out.print("请输入您的选项：");
            //声明i，获取控制台输入的内容
            int i = scanner.nextInt();
            System.out.println();
            switch (i) {
                /*
                1、增加学生信息
                 */
                case 1:
                    System.out.println("请输入编号：");
                    //编号
                    id = scanner.nextInt();
                    System.out.println("请输入姓名：");
                    //姓名
                    name = scanner.next();
                    System.out.println("请输入年龄：");
                    //年龄
                    age = scanner.nextInt();
                    //调用增加学生信息方法
                    studentMethod.add(id, name, age, list);

                    System.out.println();
                    break;
                /*
                2、查找所有学生信息
                 */
                case 2:
                    studentMethod.selectAll(list);
                    break;
                /*
                3、修改学生信息
                 */
                case 3:
                    System.out.println("请输入编号：");
                    //编号
                    id = scanner.nextInt();
                    System.out.print("修改前学员信息为：");
                    studentMethod.select(id, list);
                    System.out.println();
                    System.out.println("请输入修改后姓名：");
                    //姓名
                    name = scanner.next();
                    System.out.println("请输入修改后年龄：");
                    //年龄
                    age = scanner.nextInt();
                    Student student = null;
                    try {
                        student = new Student(id, name, age);
                    } catch (StudentIdException e) {
                        e.printStackTrace();
                    } catch (StudentAgeException e) {
                        e.printStackTrace();
                    }
                    //调用update方法并且传入相应参数
                    studentMethod.update(list, id, student);
                    //System.out.print("修改成功，修改后学员信息为：");
                    //调用selectAll方法并且传入相应参数
                    studentMethod.select(id, list);
                    System.out.println();
                    break;
                /*
                4、查看学生信息
                 */
                case 4:
                    System.out.println("请输入编号：");
                    //编号
                    id = scanner.nextInt();
                    //调用select方法并且传入相应参数
                    studentMethod.select(id, list);
                    break;
                /*
                5、删除学生信息
                 */
                case 5:
                    System.out.println("请输入编号：");
                    //编号
                    id = scanner.nextInt();
                    studentMethod.remove(list, id);
                    break;
                case 6:
                    System.out.println("退出学生信息管理系统成功！！！");
                    new StudentMethod().writerFile(list);
                    System.out.println("写入成功");
                    b = false;
                    break;
                default:
                    System.out.println("输入有误，请重新输入【1-6】");
                    break;

            }
        }


    }
}
